// class ValidWordAbbr {
// public:
//     map<string, string> record_map;
//     /*
//     * @param dictionary: a list of words
//     */ValidWordAbbr(vector<string> dictionary) {
//         for (string s: dictionary)
//         {
//             int len = s.length();
//             string abb = s[0] + to_string(len - 2) + s[len - 1];
//             if (record_map.find(abb) == record_map.end())
//             {
//                 record_map[abb] = s;
//             }
//             else if (record_map[abb] != s)
//             {
//                 record_map[abb] = "-1";
//             }
//         }
//     }

//     /*
//      * @param word: a string
//      * @return: true if its abbreviation is unique or false
//      */
//     bool isUnique(string &word) {
//         int len = word.length();
//         string abb = word[0] + to_string(len - 2) + word[len - 1];
//         return record_map.find(abb) == record_map.end() || record_map[abb] == word;
//     }
// };

// /**
//  * Your ValidWordAbbr object will be instantiated and called as such:
//  * ValidWordAbbr obj = new ValidWordAbbr(dictionary);
//  * bool param = obj.isUnique(word);
//  */



// 法二：
// 规则解读：
// • 假如apple 没在字典中出现过，a3e这个缩写也没出现过
// unique （要查找的词在词典中没有出现过）
// • 假如 cake 在字典中出现了2次 并且缩写中所有的c2e都是对应cake
// unique （要查找的词在词典中出现过，但缩写只对应要查找的词）
// • abbr dictionary = [ "d2r", "d2r", "c2e", "c2e", "c2d" ] 0 2
// • dictionary = [ "deer", "door", "cake", "cake", "card" ] 0 2

// 思路：
// • 两种情况合并在一起，总结起来的规律就是：
// – 单词在字典中出现次数等于对应缩写在字典中出现次数 -> unique
// – 单词在字典中出现次数不等于对应缩写在字典中出现次数 -> not unique
// • 用数据结构什么记录单词和缩写出现的次数
// – Hash 

class ValidWordAbbr {
public:
    map<string, int> word_map;
    map<string, int> abb_map;
    /*
    * @param dictionary: a list of words
    */ValidWordAbbr(vector<string> dictionary) {
        for (string s: dictionary)
        {
            int len = s.length();
            string abb = s[0] + to_string(len - 2) + s[len - 1];
            abb_map[abb]++;
            word_map[s]++;
        }
    }

    /*
     * @param word: a string
     * @return: true if its abbreviation is unique or false
     */
    bool isUnique(string &word) {
        int len = word.length();
        string abb = word[0] + to_string(len - 2) + word[len - 1];
        return word_map[word] == abb_map[abb];
    }
};

/**
 * Your ValidWordAbbr object will be instantiated and called as such:
 * ValidWordAbbr obj = new ValidWordAbbr(dictionary);
 * bool param = obj.isUnique(word);
 */